package com.blumov.fastbox.domain.model.compra;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.blumov.fastbox.domain.model.compra.enums.EstadoTransaccion;
import com.blumov.fastbox.domain.shared.Entity;

/**
 * Un Pedido.
 * 
 * @author Bruno Masci
 */
public class Pedido implements Entity<Pedido> {

	// Needed by Hibernate
	@SuppressWarnings("unused")
	private Integer id;
	
	private PedidoId pedidoId;

	private List<Bandeja> bandejas;
	
	private EstadoTransaccion estadoTransaccion;
	
	private Date fechaCreacion;

	// Null object pattern
	public static final Pedido NONE = new Pedido(new PedidoId(""));
	
	
	Pedido() {
		// Needed by Hibernate
	}
	
	public Pedido(final PedidoId pedidoId) {
		this.pedidoId = pedidoId;
		this.bandejas = new ArrayList<Bandeja>();
		this.fechaCreacion = new Date();
		this.setEstadoTransaccion(EstadoTransaccion.PENDIENTE);
		this.agregarBandeja();
	}

	/**
	 * The pedido id is the identity of this entity, and is unique.
	 * 
	 * @return Pedido id.
	 */
	public PedidoId pedidoId() {
		return this.pedidoId;
	}

	public void agregarItem(ItemPedido itemPedido) {
		Bandeja bandejaActiva = this.obtenerBandeja(this.indiceBandejaActiva());
		bandejaActiva.agregarItem(itemPedido);
	}

	public void agregarBandeja() {
		Bandeja bandeja = new Bandeja();
		this.bandejas.add(bandeja);
	}

	public void seleccionarBandejaAnterior() {
		if (this.indiceBandejaActiva() > 0) {
//			this.indiceBandejaActiva--;
		}
	}

	public void seleccionarBandejaSiguiente() {
//		if (this.indiceBandejaActiva < this.cantidadDeBandejas() - 1) {
//			this.indiceBandejaActiva++;
//		}
	}

	private Bandeja obtenerBandeja(int indiceBandeja) {
		return this.bandejas.get(indiceBandeja);
	}

	public Integer cantidadDeBandejas() {
		return this.bandejas.size();
	}

	public Integer indiceBandejaActiva() {
		return this.cantidadDeBandejas() - 1;
	}
	
	public List<Bandeja> getBandejas() {
		return bandejas;
	}
	
	public EstadoTransaccion getEstadoTransaccion() {
		return this.estadoTransaccion;
	}

	public void setEstadoTransaccion(EstadoTransaccion estadoTransaccion) {
		this.estadoTransaccion = estadoTransaccion;
	}
	
	public void cambiarEstado(EstadoTransaccion estadoTransaccion) {
		this.setEstadoTransaccion(estadoTransaccion);
	}
	
	public Date getFechaCreacion() {
		return fechaCreacion;
	}

	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	/**
	 * Obtiene el precio de este pedido
	 */
	public Double precio() {
		Double precioAcumulado = new Double(0);
		
		for (Bandeja bandeja : this.bandejas) {
			precioAcumulado += bandeja.precio();
		}
		
		return precioAcumulado;
	}
	
	public boolean sameIdentityAs(final Pedido other) {
		return other != null && pedidoId.sameValueAs(other.pedidoId);
	}

	/**
	 * @param object to compare
	 * @return True if they have the same identity
	 * @see #sameIdentityAs(Pedido)
	 */
	@Override
	public boolean equals(final Object object) {
		if (this == object)
			return true;
		if (object == null || getClass() != object.getClass())
			return false;
		final Pedido other = (Pedido) object;
		return sameIdentityAs(other);
	}

	/**
	 * @return Hash code of pedido id.
	 */
	@Override
	public int hashCode() {
		return pedidoId.hashCode();
	}

	@Override
	public String toString() {
		return pedidoId.toString();
	}
}
